Composer+dbtでSAの権限借用(impersonate)を使ってみる

Composer+dbtでSAの権限借用(impersonate)を使ってみる

Clock Icon2024.07.31

はじめに

データアナリティクス事業本部のkobayashiです。

dbt(dbt core)を Cloud Composer 上で動かしているデータパイプラインがあり、dbt では BigQuery の操作をしている DAG がある場合、Cloud Composer に設定してあるサービスアカウントで直接 BigQuery を操作するのではなく、別の BigQuery 操作用のサービスアカウントを使う方法をまとめます。

サービス アカウントの権限借用(Impersonate)

今回のように別のサービスアカウントから別のサービスアカウントになりすましてリソースの操作を行う場合には「サービスアカウントの権限借用」を使うことで実現が可能です。これは

  • スクリプトやプログラムが特定のサービスアカウントの権限を借用し、必要なリソースにアクセスして処理を自動化する。(作業の自動化)
  • システム管理者が個別ユーザーに直接権限を付与するのではなく、サービスアカウントを通じてアクセスを制御する。(権限管理の簡素化)
    特定のサービスアカウントに限られた権限を与え、権限の濫用を防ぐ。(セキュリティの向上)

といった場合に使うのが一般的で、今回の用途としてもBigQueryを操作するのは専用のサービスアカウントを用意しておいてComposerにはそのサービスアカウントをアタッチしないといったパターンでも活用できます。

Cloud Composer+dbtで権限借用を設定する

では実際にCloud ComposerとdbtでBigQueryに対する操作で権限借用を設定してみます。設定方法はdbtの公式ページ(Bigquery Service Account Impersonation | dbt Developer Hub )にあるのでこれに従って設定を行えば可能です。

設定は以下の流れで行います。

  • 権限を借用するサービスアカウントに対して、Cloud Composerのサービスアカウントがトークン生成を行えるロールを付与する
  • dbtのprofile.ymlで接続情報を設定する

トークン生成のロール付与

権限を借用するサービスアカウントに対してadd-iam-policy-bindingを行います。借用するサービスアカウントのトークンを発行できるようにするためroles/iam.serviceAccountTokenCreatorロールを付与します。

$ gcloud iam service-accounts add-iam-policy-binding {BQを操作するサービスアカウント}@{プロジェクト名}.iam.gserviceaccount.com --member="serviceAccount:{composerのサービスアカウント}@n{プロジェクト名}.iam.gserviceaccount.com" --role="roles/iam.serviceAccountTokenCreator" 
bindings:
- members:
  - serviceAccount:{composerのサービスアカウント}@n{プロジェクト名}.iam.gserviceaccount.com"
  role: roles/iam.serviceAccountTokenCreator
etag: BwYeXOpTbFk=
version: 1

dbtのprofile設定

次にdbtのprofile.ymlで権限を借用するプロファイルを設定します。認証はサービスアカウントの権限借用をするためmethod:oauthを設定したうえで、impersonate_service_accountに借用するサービスサービスアカウントを設定します。impersonate_service_accountを使用しないとcomposerのサービスアカウントがBigQueryの操作者になってしまうので注意が必要です。

my-profile:
  target: dev
  outputs:
    dev:
      type: bigquery
      method: oauth
      project: abc-123
      dataset: my_dataset
      impersonate_service_account: {BQを操作するサービスアカウント}@{プロジェクト名}.iam.gserviceaccount.com

まとめ

Cloud Composer+dbtのデータパイプラインで、CLoud Composerに設定してあるサービスアカウントではなく別のBigQuery操作用のサービスアカウントで処理を行う方法をまとめました。特に難しい箇所もなく設定を行うことができました。

最後まで読んで頂いてありがとうございました。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.